package es.gesfutbol.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.CombinacioGeneral;
import es.gesfutbol.domini.implementacio.CombinacioPropia;
import es.gesfutbol.domini.implementacio.Penya;
import es.gesfutbol.domini.implementacio.Penyista;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class PenyaDao extends HibernateDao<Penya, Long> implements IPenyaDao{
	
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Penya deproxy(Penya penya) {
		
		//inicialitzar Combinacions Pròpies
		Set<CombinacioPropia> combPropies = penya.getCombPropies();
		this.getSessionFactory().getCurrentSession().lock(penya, LockMode.NONE);
		Hibernate.initialize(combPropies);
	    Iterator<CombinacioPropia> itCombPropia = combPropies.iterator();
	    Set<CombinacioPropia> combPropies2 = new HashSet<CombinacioPropia>();
	    while (itCombPropia.hasNext()) {
	     	CombinacioPropia combPropia = itCombPropia.next();
	        Hibernate.initialize(combPropia);
	        combPropia = HibernateHelper.deproxy(combPropia, CombinacioPropia.class);
	        combPropies2.add(combPropia);
	    }
	    penya.setCombPropies(combPropies2);
	    
	    //inicialitzar Combinacions Generals
	    Set<CombinacioGeneral> combGenerals = penya.getCombGenerals();
		this.getSessionFactory().getCurrentSession().lock(penya, LockMode.NONE);
		Hibernate.initialize(combGenerals);
	    Iterator<CombinacioGeneral> itCombGeneral = combGenerals.iterator();
	    Set<CombinacioGeneral> combGenerals2 = new HashSet<CombinacioGeneral>();
	    while (itCombGeneral.hasNext()) {
	    	CombinacioGeneral combGeneral = itCombGeneral.next();
	        Hibernate.initialize(combGeneral);
	        combGeneral = HibernateHelper.deproxy(combGeneral, CombinacioGeneral.class);
	        combGenerals2.add(combGeneral);
	    }
	    penya.setCombGenerals(combGenerals2);
	    
	    //inicialitzar penyistes
	    Set<Penyista> penyistes = penya.getPenyistes();
	 	this.getSessionFactory().getCurrentSession().lock(penya, LockMode.NONE);
	 	Hibernate.initialize(penyistes);
        Iterator<Penyista> itPenyista = penyistes.iterator();
        Set<Penyista> penyistes2 = new HashSet<Penyista>();
        while (itPenyista.hasNext()) {
            Penyista penyista = itPenyista.next();
            Hibernate.initialize(penyista);
            penyista = HibernateHelper.deproxy(penyista, Penyista.class);
            penyistes2.add(penyista);
        }
        penya.setPenyistes(penyistes2);	         
	    
	    return penya;
	}

	@Override
	@Transactional(readOnly = true)
	public Penya findByNom(String nomPenya) {
		return (Penya) this.getSessionFactory().getCurrentSession()
				.createCriteria(Penya.class)
				.add(Restrictions.eq("nom", nomPenya)).uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true)
	@Override
	public List<Penya> findAllDirectorioPenyas() {
		return this.getSessionFactory().getCurrentSession()
				.createCriteria(Penya.class)
				.add(Restrictions.eq("directoriPenya", true)).list();
	}

}
